package com.example.demo.testdemo;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;

import java.util.List;
/*
 * @description 消息有序指的是可以按照消息的发送顺序来消费(FIFO)。RocketMQ可以严格的保证消息有序，可以分为分区有序或者全局有序
 * @author      Jon
 * @since       2021/7/14 10:26
 */
public class OrderProducer {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("order_group_producer");
        producer.setNamesrvAddr("127.0.0.1:9876");
        producer.start();
        //生成订单列表
        List<OrderStep> orderLists = OrderStep.buildOrders();
        //添加个时间
//        Date date = new Date();
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        String dateStr = sdf.format(date);
        for (int i = 0; i < orderLists.size(); i++) {
            //获取订单消息
            String body = orderLists.get(i)+"";
            Message message = new Message("Topic_order","order","KEY"+i,body.getBytes());
            /**
             * 1、第一个参数，消息队列选择器，选中指定的消息队列对象，会将所有消息队列传进来
             * 2、第二个参数，发送的消息
             * 3、第三个参数，选择队列的业务标识（订单id）
             */
            SendResult result = producer.send(
                    message,
                    new MessageQueueSelector() {
                        /**
                         *
                         * @param mqs 队列集合
                         * @param msg 消息对象
                         * @param arg 业务标识的参数
                         * @return
                         */
                        @Override
                        public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
                            //根据订单id选择发送queue
                            long id = (long) arg;
                            long orderId = id % mqs.size();
                            return mqs.get((int) orderId);
                        }
                    },
                    orderLists.get(i).getOrderId()); //获取订单id

            System.out.println(String.format("sendResult status:%s, queueId:%d, body:%s",
                    result.getSendStatus(),
                    result.getMessageQueue().getQueueId(),
                    body
            ));
        }
        producer.shutdown();
    }
}
